home *** CD-ROM | disk | FTP | other *** search
/ BBS Toolkit / BBS Toolkit.iso / rbbs_pc / rbbsasm.zip / QBARCV2.ASM < prev    next >
Assembly Source File  |  1988-03-03  |  30KB  |  910 lines

  1.         page    74,132
  2.         title   ARCV - Verbose ARC directory listing
  3.  
  4. ;       Special version of ARCV to be called by QB program
  5. ; usage:
  6. ;
  7. ;       CALL ARCV (Workname$,"filename[.ARC]", RETCD%)               ' CPC151AC
  8. ;
  9. ; notes:
  10. ;       This code originated from ARCV 1.15d - Verbose ARC directory display
  11. ;       written by V.Buerg and was modified to run as a called routine under
  12. ;       Microsoft QuickBasic.
  13. ;
  14. ;       Change 9/14/86 to dis-allow wildcards
  15. ;       Change 1/1/87 to recognize squash format
  16. ;       Change 2/18/87 to support network usage - - - - Jon Martin   ' CPC151A
  17.  
  18. print   macro   name                    ; display a field
  19.         mov     dx,offset name
  20.         call    prints
  21.         endm
  22.  
  23. printl  macro   text                    ; display a literal
  24.         local   txt,nxt
  25.         mov     dx,offset txt
  26.         call    prints
  27.         jmp     nxt
  28. txt     db      cr,lf,text
  29.         db      stopper
  30. nxt     equ     $
  31.         endm
  32.  
  33.  
  34. header  struc                           ; archive header
  35. mbrcode db      0                       ;  compression code
  36. mbrname db      13 dup (0)              ;  file name
  37. mbrsize dw      0,0                     ;  file size in archive
  38. mbrdate dw      0                       ;  creation date
  39. mbrtime dw      0                       ;  creation time
  40. mbrcrc  dw      0                       ;  cyclic redunancy check
  41. mbrlen  dw      0,0                     ;  true file size, bytes
  42. header  ends
  43.  
  44.  
  45. cseg    segment public para 'CODE'
  46.         assume  cs:cseg,ds:cseg,es:cseg
  47.  
  48.         public  arcv
  49. arcv    proc    far
  50.         push    bp                      ; save BASIC reg
  51.         mov     bp,sp                   ; get parameter list pointer
  52.         mov     cs:stkptr,sp            ; save stack ptr
  53.         mov     cs:saveds,ds            ; save QB seg reg
  54.         mov     cs:savees,es            ; save QB seg reg
  55.         mov     cs:errlvl,0             ; init return code
  56.         jmp     start                   ; do our thing
  57.  
  58. ;       return with error
  59.  
  60. error:  mov     ax,cs                   ; insure seg regs
  61.         mov     ds,ax                   ;  for proper exit
  62.         mov     es,ax
  63.         mov     sp,cs:stkptr
  64.         jmp     arcv2a                  ; produce totals anyway
  65.  
  66. ;       set DOS error level and exit
  67.  
  68. exit:   mov     sp,cs:stkptr            ; restore entry stack value
  69.         mov     bx,word ptr cs:outhdl   ; close listing file
  70.         or      bx,bx                   ; if it was opened
  71.         jz      exiting
  72.         mov     ah,3eh
  73.         int     21h
  74. exiting:
  75.         push    ds                      ; restore QB dta
  76.         mov     dx,word ptr cs:savedta[2]
  77.         mov     ds,word ptr cs:savedta
  78.         mov     ah,1ah
  79.         int     21h
  80.         pop     ds
  81.  
  82.         mov     ds,word ptr cs:saveds   ; recover QB seg regs
  83.         mov     es,word ptr cs:savees
  84.         mov     al,cs:errlvl            ; get return code
  85.         cbw
  86.         mov     bp,sp                   ; parm ptr from entry
  87.         mov     di,word ptr 6[bp]       ; ptr to retcd variable
  88.         stosw
  89.         pop     bp
  90.         ret     6                       ; clear parms from stack     ' CPC151A
  91.  
  92.         subttl  '--- constants, equates and work areas'
  93.         page
  94.  
  95. cr      equ     13
  96. lf      equ     10
  97. bel     equ     7
  98. tab     equ     9
  99.  
  100. stopper equ     0               ; end of display line indicator
  101. arcmark equ     26              ; special archive marker
  102. arcver  equ     9               ; highest compression code used
  103.  
  104. stkptr  dw      0               ; stack pointer upon entry
  105. errlvl  db      0               ; dos error level returned
  106. flags   db      0               ; find-first return code
  107.  
  108. archdl  dw      0               ; file handle
  109.  
  110. arctitl db      cr,lf,'Archive:  '
  111. arcname db      76 dup (stopper)
  112.  
  113. fileptr dw      0               ; ptr to filename part of arcname
  114. savedta dw      0,0             ; addr of QB dta
  115. dta     db      48 dup (0)      ; data transfer area
  116.  
  117. saveds  dw      0               ; QB seg reg
  118. savees  dw      0               ; QB seg reg
  119. outhdl  dw      1               ; handle for output listing
  120. temp    db      76 dup (stopper); and temporary file name            ' CPC151A
  121.  
  122.         subttl  '--- i/o control variables'
  123.         page
  124.  
  125. inbufsz equ     512             ; size of input buffer
  126. inadr   dw      offset inbuf    ; offset to input buffer
  127. inptr   dw      offset inbuf    ; offset to current byte
  128. insize  dw      inbufsz         ; size of input buffer
  129. inlen   dw      0               ; bytes left in buffer
  130. incurh  dw      0               ; current file offset
  131. incurl  dw      0               ;  low word
  132.  
  133. usage   db      cr,lf
  134.         db      'QBARCV2 - Verbose ARC directory display for QuickBasic' ; ' CPC151A
  135.         db      cr,lf,lf,'  Usage:  call arcv (workname$,arcname[.ARC],result%' ; ' CPC151A
  136.         db      cr,lf,stopper
  137.  
  138. ;       display lines for verbose
  139.  
  140. vhdr    db      cr,lf
  141.         db      cr,lf,'Name          Length    Stowage    SF   Size now  Date       Time    CRC '
  142.         db      cr,lf,'============  ========  ========  ====  ========  =========  ======  ===='
  143.         db      stopper
  144.  
  145. vline   db      cr,lf
  146. vname   db      14 dup (' ')
  147. vlength db      '       0  '    ; length in archive
  148. vstyle  db      '          '    ; compression method
  149. vfactor db      ' xx%  '        ; compression factor
  150. vsize   db      10 dup (' ')    ; actual file bytes
  151. vdate   db      'dd '           ; creation date
  152.  vmonth db      'mmm '
  153.  vyear  db      'yy  '
  154.  vtime  db      'hh:mm   '      ; creation time
  155.  vcrc   db      'xxxx'          ; crc in hex
  156.         db      stopper
  157.  
  158. hundred dw      100             ; for computing percentages
  159. totsf   dw      0,0             ; average stowage factor
  160. totlen  dw      0,0             ; total of file lengths
  161. totsize dw      0,0             ; total of file sizes
  162. totmbrs dw      0               ; total number of files
  163.  
  164. ;       final totals line
  165.  
  166. vthdr   db      cr,lf,lf,'*Total    ' ;                            ' CPC151A
  167.  vtmbrs db      '    '
  168.  vtlen  db      8 dup (' '),'  '
  169.         db      10 dup (' ')
  170.  vtsf   db      '   %  '
  171.  vtsize db      8 dup (' ')
  172.         db      cr,lf           ; for tom
  173.         db      stopper
  174.  sign   db      ' '
  175.  
  176. styles  db      '  ----- '      ; 1 = old, no compression
  177.         db      '  ----- '      ; 2 = new, no compression
  178.         db      ' Packed '      ; 3 = dle for repeat chars
  179.         db      'Squeezed'      ; 4 = huffman encoding
  180.         db      'crunched'      ; 5 = lz, no dle
  181.         db      'crunched'      ; 6 = lz with dle
  182.         db      'Crunched'      ; 7 = lz with readjust
  183.         db      'Crunched'      ; 8 = lz with readjust and dle
  184.         db      'Squashed'      ; 9 = 13-bit lz with no dle
  185.  
  186. months  db      'Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec '
  187.  
  188.         subttl  '--- mainline processing'
  189.         page
  190. ;
  191. ;       determine if command line or menu driven mode
  192.  
  193. start:
  194.         push    ds
  195.         mov     ax,cs                   ; set local seg regs
  196.         mov     ds,ax
  197.         mov     es,ax
  198.         mov     word ptr inlen,ax       ; initialize file variables
  199.         mov     word ptr incurh,ax
  200.         mov     word ptr incurl,ax
  201.  
  202.         push    cx                      ; bug fix
  203.         push    di                      ;   03-Feb-1987
  204.         cld                             ;   Steven M. Georgiades
  205.         mov     di,offset arcname
  206.         mov     al,0                    ;      Clears arcname for each call
  207.         mov     cx,76
  208.         rep     stosb
  209.         pop     di
  210.         pop     cx
  211.         pop     ds                      ;                            ' CPC151A
  212.         mov     si,word ptr 10[bp]      ; ptr to parameter vector    ' CPC151A
  213.         lodsw                           ; get string length          ' CPC151A
  214.         mov     cx,ax                   ;                            ' CPC151A
  215.         mov     si,word ptr [si]        ; get string offset          ' CPC151A
  216.         mov     di,offset temp          ;                            ' CPC151A
  217.  
  218. ;       copy first parameter                                         ' CPC151A
  219.  
  220. parm1:  lodsb                           ; copy filename              ' CPC151A
  221.         stosb                           ;                            ' CPC151A
  222.         loop    parm1                   ; loop until done            ' CPC151A
  223.         push    ds                      ;                            ' CPC151A
  224.         mov     ax,cs                   ; set local seg regs         ' CPC151A
  225.         mov     ds,ax                   ;                            ' CPC151A
  226.  
  227.         mov     dx,offset temp          ; open temporary file for output
  228.         mov     cx,0
  229.         mov     ah,3ch
  230.         int     21h
  231.         mov     outhdl,ax
  232.         pop     ds
  233.         jnc     parm2a                  ;                            ' CPC151A
  234.         mov     cs:errlvl,1             ; return error code
  235.         jmp     exit
  236.  
  237. parm2a: mov     si,word ptr 8[bp]       ; ptr to parameter vector
  238.         lodsw                           ; get string length
  239.         mov     cx,ax
  240.         mov     si,word ptr [si]        ; get string offset
  241.         or      cx,cx                   ; any operand?
  242.         jnz     parm2b                  ;                            ' CPC151A
  243.         print   usage
  244.         jmp     exit
  245.  
  246. ;       copy second parameter                                        ' CPC151A
  247.  
  248. parm2b:                                 ;                            ' CPC151A
  249.         mov     di,offset arcname
  250.  
  251. parm2c: lodsb                           ; copy filename              ' CPC151A
  252.         stosb
  253.         loop    parm2c                  ;                            ' CPC151A
  254.  
  255. ;       find filename part
  256.  
  257. parm2d:                                 ;                            ' CPC151A
  258.         mov     ax,cs                   ; need local seg regs
  259.         mov     ds,ax
  260.         mov     es,ax
  261.  
  262.         mov     si,offset arcname+75    ; end of filename stuff
  263.         std
  264.         mov     cl,76                   ; search for last path
  265. parm2e:                                 ;                            ' CPC151A
  266.         lodsb
  267.         cmp     al,'/'                  ; funny path delimiter?
  268.         je      parm2f                  ;                            ' CPC151A
  269.         cmp     al,'\'                  ; normal path delimiter?
  270.         je      parm2f                  ;                            ' CPC151A
  271.         cmp     al,':'                  ; bumped into drive?
  272.         je      parm2f                  ;                            ' CPC151A
  273.         loop    parm2e                  ;                            ' CPC151A
  274.         dec     si
  275. parm2f:                                 ;                            ' CPC151A
  276.         cld
  277.         add     si,2                    ; point to where filename goes
  278.         mov     fileptr,si              ; and save for later
  279.  
  280. ;       add default ARC extension if necessary
  281.  
  282.         mov     si,fileptr              ; start of filespec
  283.         mov     cx,13
  284. parm10:
  285.         lodsb
  286.         cmp     al,0                    ; end of name?
  287.         je      parm11
  288.         cmp     al,'.'                  ; got extension?
  289.         je      parm12
  290.         loop    parm10
  291. parm11:
  292.         mov     di,si                   ; ptr to end of name
  293.         dec     di
  294.         mov     ax,'A.'                 ; default extension
  295.         stosw
  296.         mov     ax,'CR'
  297.         stosw
  298.         mov     ax,0FF00h               ; append stoppers
  299.         stosw
  300. parm12:
  301.  
  302. ;       find first matching file
  303.  
  304. getfirst:
  305.         push    es
  306.         mov     ah,2fh                  ; get current dta ptr
  307.         int     21h                     ; returned in es:bx
  308.         mov     word ptr savedta,es
  309.         mov     word ptr savedta[2],bx
  310.         pop     es
  311.  
  312.         mov     dx,offset dta           ; set local dta for murkers
  313.         mov     ah,1ah
  314.         int     21h
  315.  
  316. ;       re-initialize
  317.  
  318. not_found:
  319.         sub     ax,ax                   ; reset totals counters
  320.         mov     totmbrs,ax
  321.         mov     totsize,ax
  322.         mov     totsize+2,ax
  323.         mov     totlen,ax
  324.         mov     totlen+2,ax
  325.         mov     totsf,ax
  326.         mov     inlen,ax
  327.         mov     incurl,ax
  328.         mov     incurh,ax
  329.         mov     dx,offset inbuf
  330.         mov     inptr,dx
  331.  
  332.         call    openarc                 ; see if archive exists
  333.         jnc     arcv1
  334.         jmp     exit
  335.  
  336.         page
  337. ;
  338. ;       process next archive header entry
  339.  
  340. ; arcv1:  print   arctitl   ' removed for security reasons in CPC16-1A
  341. arcv1:  print   vhdr
  342.  
  343. arcvnext:
  344.         call    gethdr                  ; load next header
  345.         jnc     arcv2
  346.         jmp     exit                    ; all done
  347.  
  348. arcv2:  cmp     archdr.mbrcode,0        ; archive eof?
  349.         je      arcv2a
  350.         jmp     arcvgo
  351.  
  352. arcv2a:
  353.         mov     ax,totmbrs              ; total files
  354.         or      ax,ax                   ; are there any?
  355.         jnz     format_totals
  356.         jmp     skip_totals
  357.  
  358. format_totals:
  359.         sub     dx,dx
  360.         mov     si,offset vtmbrs-4
  361.         call    format
  362.  
  363.         mov     dx,totlen+2             ; total actual file size
  364.         mov     ax,totlen
  365.         mov     si,offset vtlen
  366.         call    format
  367.  
  368.         mov     dx,totsize+2            ; total achive file size
  369.         mov     ax,totsize
  370.         mov     si,offset vtsize
  371.         call    format
  372.  
  373. ; reduce the total size/length to word values
  374.  
  375.         mov     bx,totlen               ; get actual file size
  376.         mov     ax,totlen+2
  377.         mov     cx,totsize              ; length of file in archive
  378.         mov     dx,totsize+2
  379. arcv2b: or      ax,ax                   ; big number?
  380.         jz      arcv2c                  ; nope, can use it
  381.         shr     ax,1                    ; yup, divide by two
  382.         rcr     bx,1
  383.         shr     dx,1
  384.         rcr     cx,1
  385.         jmp     short arcv2b
  386.  
  387. arcv2c: mov     si,offset vtsf-5        ; format stowage factor
  388.         mov     ax,bx
  389.         mov     sign,' '                ; whata kludge
  390.         cmp     ax,cx                   ; arc is bigger than orig?
  391.         jb      arcv2c1
  392.         sub     ax,cx                   ; amount saved
  393.         jmp     short arcv2f
  394. arcv2c1:
  395.         sub     ax,cx
  396.         neg     ax
  397.         mov     sign,'-'
  398. arcv2f:
  399.         mul     hundred                 ; to percentage
  400.         add     ax,50
  401.         adc     dx,0                    ; round up percent
  402.         or      bx,bx                   ; empty file?
  403.         jnz     arcv2d
  404.         mov     ax,100
  405.         jmp     short arcv2e
  406.  
  407. arcv2d: div     bx
  408. arcv2e: sub     dx,dx
  409.         call    format
  410.  
  411.         mov     al,sign
  412.         mov     vtsf,al
  413.         print   vthdr                   ; display totals
  414.  
  415. skip_totals:
  416.         call    closarc
  417.         jmp     exit                    ;                            ' CPC151A
  418.  
  419.         page
  420. ;
  421. ;       format single line for each member
  422.  
  423. arcvgo:
  424.         mov     di,offset vname         ; copy file name
  425.         mov     si,offset archdr.mbrname
  426.         mov     cx,13
  427. arcv3:
  428.         lodsb
  429.         cmp     al,0                    ; end of name?
  430.         je      arcv4
  431.         stosb
  432.         loop    arcv3
  433.         jmp     short arcv5
  434. arcv4:
  435.         mov     al,' '                  ; pad with blanks
  436.         rep     stosb
  437. arcv5:
  438.         inc     totmbrs
  439.  
  440. ; reduce the size/length to word values
  441.  
  442.         mov     bx,archdr.mbrlen        ; get actual file size
  443.         mov     ax,archdr.mbrlen+2
  444.  
  445.         mov     cx,archdr.mbrsize       ; length of file in archive
  446.         mov     dx,archdr.mbrsize+2
  447.  
  448. arcv51: or      ax,ax                   ; big number?
  449.         jz      arcv52                  ; nope, can use it
  450.         shr     ax,1                    ; yup, divide by two
  451.         rcr     bx,1
  452.         shr     dx,1
  453.         rcr     cx,1
  454.         jmp     short arcv51
  455.  
  456. arcv52: mov     si,offset vfactor-5     ; format stowage factor
  457.         mov     ax,bx                   ; low word of actual size
  458.         mov     sign,' '
  459.         cmp     ax,cx                   ; arc member is larger?
  460.         jb      arcv520
  461.         sub     ax,cx                   ; amount saved
  462.         jmp     arcv56
  463. arcv520:
  464.         sub     ax,cx
  465.         neg     ax
  466.         mov     sign,'-'
  467. arcv56:
  468.         mul     hundred                 ; to percentage
  469.         add     ax,50
  470.         adc     dx,0                    ; round up percent
  471.         or      bx,bx                   ; empty file?
  472.         jnz     arcv53
  473.         mov     ax,100
  474.         jmp     short arcv54
  475.  
  476. arcv53: div     bx
  477. arcv54: sub     dx,dx
  478.         cmp     ax,100                  ; archive fouled?
  479.         jbe     arcv55
  480.         sub     ax,ax
  481. arcv55:
  482.         call    format
  483.         mov     al,sign
  484.         mov     vfactor,al
  485.  
  486.         sub     bx,bx                   ; determine style
  487.         mov     bl,archdr.mbrcode
  488.         mov     cl,3                    ; eight bytes each entry
  489.         shl     bx,cl
  490.         lea     si,styles-8[bx]         ; get ptr to style name
  491.         mov     di,offset vstyle
  492.         mov     cx,8
  493.         rep     movsb
  494.  
  495.         mov     si,offset vsize         ; format file size
  496.         mov     dx,archdr.mbrsize+2
  497.         mov     ax,archdr.mbrsize
  498.         add     totsize,ax
  499.         adc     totsize+2,dx
  500.         call    format
  501.  
  502.         mov     si,offset vlength       ; format file length
  503.         mov     dx,archdr.mbrlen+2
  504.         mov     ax,archdr.mbrlen
  505.         add     totlen,ax
  506.         adc     totlen+2,dx
  507.         call    format
  508.  
  509.         mov     ax,archdr.mbrdate       ; format file date
  510.         call    getdate
  511.  
  512.         mov     ax,archdr.mbrtime       ; format file time
  513.         call    gettime
  514.  
  515.         mov     ax,archdr.mbrcrc        ; format crc in hex
  516.         mov     di,offset vcrc
  517.         call    cvh
  518.  
  519.         print   vline                   ; display this file info
  520.  
  521.         mov     cx,word ptr archdr.mbrsize+2
  522.         mov     dx,word ptr archdr.mbrsize
  523.         add     dx,incurl               ; add current file offset
  524.         adc     cx,0
  525.         add     cx,incurh
  526.         mov     ax,4200h                ; skip over file data
  527.         mov     bx,archdl
  528.         int     21h
  529.         mov     incurh,dx               ; new position
  530.         mov     incurl,ax
  531.         mov     inlen,0                 ; reset read buffer
  532.         jmp     arcvnext
  533.  
  534.         subttl  ' - miscellaneous subroutines'
  535.         page
  536.  
  537. openarc proc    near                    ; open new archive
  538.         push    bx
  539.         mov     byte ptr errlvl,0
  540.         mov     dx,offset arcname
  541.         mov     ax,3d00h                ; for input
  542.         int     21h
  543.         jc      openerr
  544.         mov     archdl,ax               ; save file handle
  545.         clc
  546.         pop     bx
  547.         ret
  548. openerr:
  549.         printl  'Unable to open archive: '
  550.         print   arcname
  551.         mov     errlvl,2                ; set bad return code
  552.         jmp     error
  553. openarc endp
  554.  
  555.  
  556. closarc proc    near
  557.         push    bx
  558.         mov     bx,archdl               ; previous handle
  559.         or      bx,bx                   ; already open?
  560.         jz      closed
  561.         mov     ah,3eh                  ; yes, so close it
  562.         int     21h
  563. closed: mov     archdl,0
  564.         pop     bx
  565.         ret
  566. closarc endp
  567.  
  568. ;
  569. ;       print string like int 21h function 9
  570.  
  571. prints  proc    near                    ; dx has offset to string
  572.         push    si                      ;  ending in char x'ff'
  573.         push    bx
  574.         push    cx
  575.         mov     si,dx
  576.         sub     cx,cx
  577. ps1:    lodsb
  578.         cmp     al,stopper              ; ending hex ff?
  579.         je      ps9
  580.         inc     cx                      ; incr text length
  581.         jmp     ps1
  582.  
  583. ps9:    mov     ah,40h                  ; write to file
  584.         mov     bx,outhdl               ; using std out or temp file
  585.         int     21h
  586.  
  587.         pop     cx                      ; recover registers
  588.         pop     bx
  589.         pop     si
  590.         ret
  591. prints  endp
  592.  
  593.         page
  594. ;
  595. ;       format the time
  596.  
  597. time    record  hour:5,min:6,sec:5      ;packed time
  598.  
  599. gettime proc    near                    ;format the date
  600.         mov     di,offset vtime
  601.         or      ax,ax                   ;it is zero?
  602.         jz      gottime
  603.         push    ax                      ;save date
  604.         and     ax,mask hour            ;get hour part
  605.         mov     cl,hour                 ;bits to shift
  606.         shr     ax,cl
  607.         call    cnvrt1
  608.         stosw
  609.         mov     al,':'
  610.         stosb
  611.  
  612. gt3:    pop     ax                      ;get the time back
  613.         and     ax,mask min             ;get min part
  614.         mov     cl,min                  ;bits to shift
  615.         call    cnvrt
  616.         stosw
  617. gottime:ret
  618. gettime endp
  619.  
  620. cnvrt2  proc    near                    ;convert to ascii
  621.         call    cnvrt
  622.         cmp     al,'0'                  ;suppress leading zero
  623.         jne     cnvrtd
  624.         mov     al,' '
  625.         ret
  626.  
  627. cnvrt:  shr     ax,cl
  628. cnvrt1: aam                             ;make al into bcd
  629.         or      ax,'00'                 ; and to ascii
  630.         xchg    al,ah
  631. cnvrtd: ret
  632. cnvrt2  endp
  633.  
  634.         page
  635. ;
  636. ;       format the date
  637.  
  638. date    record  yr:7,mo:4,dy:5          ;packed date
  639.  
  640. getdate proc    near                    ;format the date
  641.         or      ax,ax                   ;is it zero?
  642.         jz      gotdate
  643.         push    ax                      ;save date
  644.         and     ax,mask yr              ;get year part
  645.         mov     cl,yr                   ;bits to shift
  646.         call    cnvrt
  647.         mov     di,offset vyear
  648.         or      al,'8'                  ;adjust for base year
  649.         stosw
  650.  
  651.         pop     bx                      ;get the date back
  652.         push    bx                      ;save it
  653.         and     bx,mask mo              ;get month part
  654.         mov     cl,mo                   ;bits to shift
  655.         shr     bx,cl
  656.         add     bx,bx                   ; form month table index
  657.         add     bx,bx
  658.         lea     si,word ptr months-4[bx]
  659.         mov     cx,3
  660.         mov     di,offset vmonth
  661.         rep     movsb
  662.  
  663.         pop     ax                      ;get the date back
  664.         and     ax,mask dy              ;get day part
  665.         mov     cl,dy                   ;bits to shift
  666.         call    cnvrt
  667.         mov     di,offset vdate
  668.         stosw
  669. gotdate:ret
  670. getdate endp
  671.  
  672.         page
  673. ;
  674. ; ripped from sdir.asm. how does this work?
  675.  
  676. ddptr   dw      0
  677.  
  678. format  proc    near    ;formats a 32 bit integer in dx:ax
  679.         push    bp      ; to ds:si
  680.         push    bx
  681.         push    di
  682.         push    si
  683.         mov     ddptr,si        ;addr of target field
  684.         mov     di,dx           ;routine uses di:si
  685.         mov     si,ax
  686.         call    printdd
  687.         pop     si
  688.         pop     di
  689.         pop     bx
  690.         pop     bp
  691.         ret
  692.  
  693. printdd:
  694.         xor     ax,ax           ;zero out the
  695.         mov     bx,ax           ; working
  696.         mov     bp,ax           ; registers.
  697.         mov     cx,32           ;# bits of precision
  698. j1:     shl     si,1
  699.         rcl     di,1
  700.         xchg    bp,ax
  701.         call    j6
  702.         xchg    bp,ax
  703.         xchg    bx,ax
  704.         call    j6
  705.         xchg    bx,ax
  706.         adc     al,0
  707.         loop    j1
  708.         mov     cx,1710h
  709.         mov     ax,bx
  710.         call    j2
  711.         mov     ax,bp
  712. j2:     push    ax
  713.         mov     dl,ah
  714.         call    j3
  715.         pop     dx
  716. j3:     mov     dh,dl
  717.         shr     dl,1            ;move high
  718.         shr     dl,1            ; nibble to
  719.         shr     dl,1            ; the low
  720.         shr     dl,1            ; position.
  721.         call    j4
  722.         mov     dl,dh
  723. j4:     and     dl,0fh          ;mask low nibble
  724.         jz      j5              ;if not zero
  725.         mov     cl,0
  726. j5:     dec     ch
  727.         and     cl,ch
  728.         or      dl,'0'          ;fold in ascii zero
  729.         sub     dl,cl
  730.         mov     bx,ddptr
  731.         mov     [bx],dl         ;ptr to next target field
  732.         inc     ddptr
  733.         ret
  734.  
  735. j6:     adc     al,al
  736.         daa
  737.         xchg    al,ah
  738.         adc     al,al
  739.         daa
  740.         xchg    al,ah
  741.         ret
  742. format  endp
  743.  
  744.         page
  745. cvh     proc    near            ; convert 16-bit binary word in ax
  746.         push    di              ; to hex ASCII string at ds:di
  747.         push    bx              ; save registers
  748.         push    cx
  749.         push    dx
  750.  
  751.         mov     dx,ax           ; save 16-bits
  752.  
  753.         mov     bl,dh           ; third nibble
  754.         mov     cl,4
  755.         shr     bl,cl
  756.         mov     al,hexchar[bx]
  757.         stosb
  758.  
  759.         mov     bl,dh           ; last nibble
  760.         and     bl,0fh
  761.         mov     al,hexchar[bx]
  762.         stosb
  763.  
  764.         mov     bl,dl           ; first nibble
  765.         mov     cl,4
  766.         sub     bh,bh
  767.         shr     bl,cl           ; isolate
  768.         mov     al,hexchar[bx]
  769.         stosb
  770.  
  771.         mov     bl,dl           ; second nibble
  772.         and     bl,0fh          ; isolate
  773.         mov     al,hexchar[bx]
  774.         stosb
  775.         pop     dx              ; restore registers
  776.         pop     cx
  777.         pop     bx
  778.         pop     di
  779.         ret                     ; return
  780.  
  781. hexchar db      '0123456789ABCDEF'
  782. cvh     endp
  783.  
  784.         subttl  ' - i/o subroutines'
  785.         page
  786.  
  787. getc    proc    near                    ; return next byte in al
  788.         push    si                      ;  or cf=1 for eof
  789. getc1:
  790.         dec     inlen                   ; any left in buffer
  791.         jge     getc2                   ; yes, pick it up
  792.         call    getblk
  793.         jnc     getc1
  794.         pop     si                      ; return cf=1 at eof
  795.         ret
  796. getc2:
  797.         mov     si,inptr                ; offset to next byte
  798.         lodsb
  799.         mov     inptr,si
  800.         add     incurl,1                ; bump file offset
  801.         adc     incurh,0
  802.         pop     si
  803.         ret
  804. getc    endp
  805.  
  806.  
  807. getblk  proc    near                    ; read next block
  808.         push    bx
  809.         push    cx
  810.         push    dx
  811.         mov     ah,3fh                  ; read from handle
  812.         mov     bx,archdl               ; arc file handle
  813.         mov     cx,inbufsz              ; input buffer size
  814.         mov     dx,offset inbuf         ; offset to input buffer
  815.         mov     inptr,dx
  816.         int     21h
  817.         jc      getblkr                 ; oops
  818.         or      ax,ax                   ; anything read?
  819.         jnz     getblka
  820.         stc                             ; no, set cf=1 for eof
  821.         jmp     short getblkx           ; and exit
  822. getblka:
  823.         mov     inlen,ax                ; return count of bytes read
  824. getblkx:
  825.         pop     dx
  826.         pop     cx
  827.         pop     bx
  828.         ret
  829.  
  830. getblkr:
  831.         printl  'I/O error reading '
  832.         print   arcname
  833.         mov     errlvl,3                ; set bad return code
  834.         jmp     error                   ; gotta quit
  835. getblk  endp
  836.  
  837.         subttl  '--- load next archive header'
  838.         page
  839.  
  840. gethdr  proc    near
  841.         mov     cx,132                  ; gotta look for the damn thing
  842. gethdr2:
  843.         call    getc                    ; get next file byte
  844.         jc      gethdrr1                ; premature eof
  845.         cmp     al,arcmark              ; start of header?
  846.         je      gethdr3                 ; yup, let's start cookin
  847.         loop    gethdr2
  848. gethdrr1:
  849.         printl  'Invalid archive format!'
  850.         mov     errlvl,4                ; set bad return code
  851.         jmp     error
  852.  
  853. gethdr3:
  854.         call    getc                    ; get version code
  855.         jc      gethdrr1
  856.         mov     archdr.mbrcode,al
  857.         cmp     al,arcver               ; reasonable code?
  858.         ja      gethdrr1                ; nope, funny stuff
  859.         cmp     al,0                    ; archive eof?
  860.         je      gethdr9                 ; yup done
  861.  
  862.         mov     cx,13                   ; get member name
  863.         mov     di,offset archdr.mbrname
  864. gethdr4:
  865.         call    getc
  866.         jc      gethdrr1
  867.         stosb
  868.         loop    gethdr4
  869. gethdr5:
  870.         mov     cx,10                   ; length remaining
  871.         cmp     archdr.mbrcode,1        ; old format?
  872.         je      gethdr6                 ; yes, it's short
  873.         mov     cl,14
  874. gethdr6:
  875.         mov     di,offset archdr.mbrsize
  876. gethdr7:
  877.         call    getc
  878.         jc      gethdrr1
  879.         stosb
  880.         loop    gethdr7
  881. gethdr8:
  882.         cmp     archdr.mbrcode,1        ; old format?
  883.         jne     gethdr9                 ; if so, it's short
  884.         mov     si,offset archdr.mbrsize                             ; CPC15-1C
  885.         mov     di,offset archdr.mbrlen                              ; CPC15-1C
  886.         mov     cx,4
  887.         rep     movsb
  888. gethdr9:
  889.         clc
  890.         ret
  891.  
  892. gethdrr2:
  893.         printl  'Invalid archive header'
  894.         mov     errlvl,5                ; set bad return code
  895.         jmp     error
  896.  
  897. gethdr  endp
  898.  
  899.         subttl  '--- i/o data areas'
  900.         page
  901.  
  902. arcv    endp
  903.  
  904. archdr  db      64 dup (0)              ; i/o area for a header
  905.  
  906. inbuf   db      inbufsz dup (0)
  907.  
  908. cseg    ends
  909.         end
  910.